// This file is included from the Bjarne Stroustrup website
#include "Date.h"																			

Date::Date(int yy, Month mm, int dd)
    : y(yy), m(mm), d(dd)
{
    if (!is_date(yy,mm,dd)) throw Invalid();
}

const Date& default_date()
{
    static const Date dd(2001,Date::jan,1); // start of 21st century
    return dd;
}

Date::Date()
    :y(default_date().year()),
     m(default_date().month()),
     d(default_date().day())
{
}

void Date::add_year(int n)
{
    if (m==feb && d==29 && !leapyear(y+n)) { // beware of leap years!
        m = mar;        // use March 1 instead of February 29
        d = 1;
    }
    y+=n;
}

bool is_date(int y, Date::Month  m, int d)
{
    // assume that y is valid

    if (d<=0) return false;            // d must be positive

    int days_in_month = 31;            // most months have 31 days

    switch (m) {
case Date::feb:                        // the length of February varies
    days_in_month = (leapyear(y))?29:28;
    break;
case Date::apr: case Date::jun: case Date::sep: case Date::nov:
    days_in_month = 30;                // the rest have 30 days
    break;
    }

    if (days_in_month<d) return false;

    return true;
} 

bool leapyear(int y)			
{
	if(y%4==0){					//AO A2
		if(y%100==0){			//AO A2
			if(y%400==0)		//AO A2
				return true;	//AO A2
			return false;		//AO A2
		}						//AO A2
		return true;			//AO A2
	}							//AO A2
	return false;				//AO A2
}

bool operator==(const Date& a, const Date& b)
{
    return a.year()==b.year()
        && a.month()==b.month()
        && a.day()==b.day();
}

bool operator!=(const Date& a, const Date& b)
{
    return !(a==b);
}

ostream& operator<<(ostream& os, const Date& d)
{
    return os << '(' << d.year()
              << ',' << d.month()
              << ',' << d.day() 
              << ')';
}

istream& operator>>(istream& is, Date& dd)
{
    int y, m, d;
    is >> y >> m >> d;
    if (!is) return is;
    dd = Date(y,Date::Month(m),d);     // update dd
    return is;
}

enum Day {
    sunday, monday, tuesday, wednesday, thursday, friday, saturday
};
